package cn.mujiankeji.mbrowser.界面.小窗页.请求

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Button
import androidx.compose.material3.Divider
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import cn.mujiankeji.mbrowser.数据.数据库.DaoUserScript
import cn.mujiankeji.mbrowser.工具.操作.用户脚本操作
import cn.mujiankeji.mbrowser.界面.框架.小窗视图.小窗状态
import cn.mujiankeji.mbrowser.界面.组件.布局.底部窗口布局
import cn.mujiankeji.mbrowser.界面.组件.系统底部空间占位
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

/**
 * 用户脚本安装窗口状态
 *
 * 用于在安装或更新用户脚本时向用户展示脚本信息并获取确认
 *
 * @param 脚本源代码 要安装的脚本源代码
 * @param userScriptDao 用户脚本数据访问对象
 * @param 完成回调 安装完成后的回调，参数为是否成功安装和脚本ID
 */
class 用户脚本安装窗口状态(
    val 脚本源代码: String,
    val userScriptDao: DaoUserScript,
    val 完成回调: (Boolean, Long) -> Unit = { _, _ -> }
)
    : 小窗状态() {
    // 解析脚本信息
    val 脚本信息 = 用户脚本操作.解析(脚本源代码)

    // 是否为更新操作
    var 是否更新 by mutableStateOf(false)

    // 已存在的脚本ID
    var 已存在脚本ID by mutableStateOf(-1L)

    init {
        // 在初始化时检查是否为更新操作
        CoroutineScope(Dispatchers.Main).launch {
            检查是否为更新()
        }
    }

    // 检查是否为更新操作
    suspend fun 检查是否为更新() {
        withContext(Dispatchers.IO) {
            val 所有脚本 = userScriptDao.获取所有启用脚本()
            for (脚本 in 所有脚本) {
                if (用户脚本操作.是否相同脚本(脚本, 脚本信息)) {
                    是否更新 = true
                    已存在脚本ID = 脚本.id
                    break
                }
            }
        }
    }

    /**
     * 安装脚本
     */
    fun 安装脚本() {
        CoroutineScope(Dispatchers.Main).launch {
            val 结果 = 用户脚本操作.安装脚本(脚本源代码, userScriptDao)
            完成回调(结果.first, 结果.second)
            销毁小窗()
        }
    }

    /**
     * 取消安装
     */
    fun 取消安装() {
        完成回调(false, -1)
        销毁小窗()
    }

    /**
     * 显示用户脚本安装窗口
     * 静态方法，用于快速创建并显示窗口
     */
    companion object {
        fun 显示安装窗口(脚本源代码: String, userScriptDao: DaoUserScript, 完成回调: (Boolean, Long) -> Unit = { _, _ -> }) {
            val 窗口状态 = 用户脚本安装窗口状态(脚本源代码, userScriptDao, 完成回调)
            窗口状态.显示()
        }
    }
}

/**
 * 用户脚本安装窗口
 *
 * @param 状态 窗口状态
 */
@Composable
fun 用户脚本请求安装窗口实现(状态: 用户脚本安装窗口状态) {
    底部窗口布局(销毁 = {状态.销毁小窗()},
        contentPaddingValues = PaddingValues(horizontal = 10.dp)
    ){
        // 标题
        Text(
            text = if (状态.是否更新) "更新用户脚本" else "安装用户脚本",
            style = MaterialTheme.typography.headlineSmall,
            fontWeight = FontWeight.Bold
        )

        Spacer(modifier = Modifier.height(16.dp))

        // 脚本信息
        Column(
            modifier = Modifier
                .fillMaxWidth()
                .weight(1f, fill = false)
                .verticalScroll(rememberScrollState())
        ) {
            // 脚本名称
            InfoRow(label = "名称", value = 状态.脚本信息.名称)

            // 脚本作者
            if (状态.脚本信息.作者.isNotEmpty()) {
                InfoRow(label = "作者", value = 状态.脚本信息.作者)
            }

            // 脚本版本
            if (状态.脚本信息.版本.isNotEmpty()) {
                InfoRow(label = "版本", value = 状态.脚本信息.版本)
            }

            // 脚本描述
            if (状态.脚本信息.描述.isNotEmpty()) {
                InfoRow(label = "描述", value = 状态.脚本信息.描述)
            }

            Divider(modifier = Modifier.padding(vertical = 8.dp))

            // 匹配地址
            if (状态.脚本信息.匹配地址.isNotEmpty()) {
                Text(
                    text = "匹配地址:",
                    fontWeight = FontWeight.Bold,
                    style = MaterialTheme.typography.bodyMedium
                )
                Spacer(modifier = Modifier.height(4.dp))
                状态.脚本信息.匹配地址.forEach { url ->
                    Text(
                        text = "• $url",
                        style = MaterialTheme.typography.bodySmall,
                        modifier = Modifier.padding(start = 8.dp)
                    )
                }
                Spacer(modifier = Modifier.height(8.dp))
            }

            // 权限信息
            if (状态.脚本信息.油猴API.isNotEmpty()) {
                Text(
                    text = "请求权限:",
                    fontWeight = FontWeight.Bold,
                    style = MaterialTheme.typography.bodyMedium
                )
                Spacer(modifier = Modifier.height(4.dp))
                状态.脚本信息.油猴API.forEach { api ->
                    Text(
                        text = "• $api",
                        style = MaterialTheme.typography.bodySmall,
                        modifier = Modifier.padding(start = 8.dp)
                    )
                }
                Spacer(modifier = Modifier.height(8.dp))
            }

            // 不良引导说明
            if (状态.脚本信息.不良引导说明.isNotEmpty()) {
                Box(
                    modifier = Modifier
                        .fillMaxWidth()
                        .background(
                            MaterialTheme.colorScheme.errorContainer,
                            RoundedCornerShape(8.dp)
                        )
                        .padding(8.dp)
                ) {
                    Column {
                        Text(
                            text = "警告",
                            fontWeight = FontWeight.Bold,
                            color = MaterialTheme.colorScheme.error
                        )
                        Text(
                            text = 状态.脚本信息.不良引导说明,
                            style = MaterialTheme.typography.bodySmall,
                            color = MaterialTheme.colorScheme.onErrorContainer
                        )
                    }
                }
                Spacer(modifier = Modifier.height(8.dp))
            }
        }

        Spacer(modifier = Modifier.height(16.dp))

        // 按钮
        Row(
            modifier = Modifier.fillMaxWidth(),
            horizontalArrangement = Arrangement.End
        ) {
            OutlinedButton(
                onClick = { 状态.取消安装() }
            ) {
                Text("取消")
            }

            Spacer(modifier = Modifier.width(8.dp))

            Button(
                onClick = { 状态.安装脚本() }
            ) {
                Text(if (状态.是否更新) "更新" else "安装")
            }
        }

        系统底部空间占位()
    }

}

/**
 * 信息行组件
 *
 * @param label 标签
 * @param value 值
 */
@Composable
private fun InfoRow(label: String, value: String) {
    Row(
        modifier = Modifier
            .fillMaxWidth()
            .padding(vertical = 4.dp),
        verticalAlignment = Alignment.Top
    ) {
        Text(
            text = "$label:",
            fontWeight = FontWeight.Bold,
            style = MaterialTheme.typography.bodyMedium,
            modifier = Modifier.width(56.dp)
        )

        Text(
            text = value,
            style = MaterialTheme.typography.bodyMedium,
            overflow = TextOverflow.Ellipsis
        )
    }

    Spacer(modifier = Modifier.height(4.dp))
}